package controller

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"k8s-platform/service"
	"log"
	"net/http"
)

var Pod pod

type pod struct{}

//获取pod列表  支持过滤  分页  排序
func (p *pod) GetPods(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		FilterName string `form:"filter_name"`
		Namespace  string `form:"namespace"`
		Limit      int    `form:"limit"`
		Page       int    `form:"page"`
	})
	//form使用Bind方法  json使用ShouldBindJSON
	if err := c.Bind(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}
	data, err := service.Pod.GetPods(params.FilterName, params.Namespace, params.Limit, params.Page)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "get pod list success",
		"data": data,
	})
}

//获取pod详情 http://127.0.0.1:8081/api/k8s/pod/detail?pod_name=cetest-54bc997d57-9bk8r&namespace=default
func (p *pod) GetPodDetail(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		PodName   string `form:"pod_name"`
		Namespace string `form:"namespace"`
	})
	//form使用Bind方法  json使用ShouldBindJSON
	if err := c.Bind(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}
	data, err := service.Pod.GetPodDetail(params.PodName, params.Namespace)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "get pod detail success",
		"data": data,
	})
}

//更改pod
func (p *pod) UpdatePod(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		Content   string `json:"content"  binding:"required"`
		Namespace string `json:"namespace"  binding:"required"`
	})
	//form使用Bind方法  json使用ShouldBindJSON
	if err := c.ShouldBindJSON(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}
	err := service.Pod.UpDatePod(params.Namespace,params.Content)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "update pod success",
		"data": nil,
	})
}


//删除pod
//{
//    "namespace":"default",
//    "pod_name":"cetest-54bc997d57-vcvdr"
//}
func (p *pod) DeletePod(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		PodName   string `json:"pod_name"`
		Namespace string `json:"namespace"`
	})
	//form使用Bind方法  json使用ShouldBindJSON
	if err := c.ShouldBindJSON(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}
	err := service.Pod.DeletePod(params.PodName, params.Namespace)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "delete pod [ "+ params.PodName + " ] success",
		"data": nil,
	})
}


//获取pod日志 http://127.0.0.1:8081/api/k8s/pod/logs?container_name=npds-client&namespace=npds&pod_name=npds-client-0
func (p *pod) GetPodLog(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		ContainerName string `form:"container_name"`
		Namespace  string `form:"namespace"`
		PodName      string    `form:"pod_name"`
	})
	//form使用Bind方法  json使用ShouldBindJSON
	if err := c.Bind(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}

	data, err := service.Pod.GetPodLog(params.ContainerName, params.PodName, params.Namespace)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "get container logs success",
		"data": data,
	})
}


//获取每个namespace的pod数量 http://127.0.0.1:8081/api/k8s/podnum
func (p *pod) GetPodNum(c *gin.Context) {

	data, err := service.Pod.GetPodNumPerNp()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "get pods num in namepase success",
		"data": data,
	})
}


//获取pod中容器名称 http://127.0.0.1:8081/api/k8s/pod/container?namespace=npds&pod_name=npds-client-0
func (p *pod) GetPodContainer(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		Namespace  string `form:"namespace"`
		PodName      string    `form:"pod_name"`
	})
	//form使用Bind方法  json使用ShouldBindJSON
	if err := c.Bind(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}

	data, err := service.Pod.GetPodContainer(params.PodName, params.Namespace)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "get container name success",
		"data": data,
	})
}